package br.com.dponto.ponto;

import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import br.com.dponto.usuario.Usuario;
import br.com.dponto.usuario.UsuarioRN;
import br.com.dponto.util.DAOException;

public class PontoDAOHibernate implements PontoDAO {
	private static final Logger logger = Logger
			.getLogger(PontoDAOHibernate.class.getName());

	private Session session;

	public void setSession(Session session) {
		this.session = session;
	}

	@Override
	public void salvar(Ponto ponto) {

		try {
			this.session.save(ponto);
			logger.info("Ponto registrado com sucesso.");

		} catch (Exception e) {
			logger.error("Ocorreu um erro ao tentar registra o  ponto : "
					+ new DAOException().getCause() + "\n " + e.getMessage());
			throw new ExceptionInInitializerError();

		}

	}

	public void alterar(Ponto ponto) {
		try {
			this.session.update(ponto);
			logger.info("Ponto alterado com sucesso.");

		} catch (Exception e) {
			logger.error("Ocorreu um erro ao tentar alterar o  ponto : "
					+ new DAOException().getCause() + "\n " + e.getMessage());
			throw new ExceptionInInitializerError();
		}

	}

	@Override
	public void excluir(Ponto ponto) {
		try {
			this.session.delete(ponto);
			logger.info("Ponto excluido com sucesso.");

		} catch (Exception e) {
			logger.error("Ocorreu um erro ao tentar excluir o  ponto : "
					+ new DAOException().getCause() + "\n " + e.getMessage());
			throw new ExceptionInInitializerError();
		}
	}

	@Override
	public List<Ponto> listar(Usuario usuario) {
		Criteria criteria = this.session.createCriteria(Ponto.class);
		criteria.add(Restrictions.eq("usuario", usuario));
		return criteria.list();

	}

	@Override
	public Ponto bucarPorData(Date data, Usuario usuario) {
		Criteria criteria = this.session.createCriteria(Ponto.class);
		criteria.add(Restrictions.eq("data", data));
		criteria.add(Restrictions.eq("usuario", usuario));
		return (Ponto) criteria.uniqueResult();

	}

}
